package com.atguigu.c_designed.m1createModel.c2factory.f1simple;


/**
 * 这便是简单工厂模式了。下面是其好处：
 * 首先，使用了简单工厂模式后，我们的程序不在"有病"，更加符合现实中的情况；而且客户端免除了直接创建产品对象的责任，而仅仅负责"消费"产品（正如暴发户所为）。
 * 下面我们从开闭原则上来分析下简单工厂模式。当暴发户增加了一辆车的时候，只要符合抽象产品制定的合同，那么只要通知工厂类知道就可以被客户使用了。
 * 那么对于产品部分来说，它是符合开闭原则的--对扩展开放、对修改关闭；
 * 但是工厂部分好像不太理想，因为每增加一辆车，都要在工厂类中增加相应的商业逻辑和判断逻辑，这显自然是违背开闭原则的。
 * 对于这样的工厂类（在我们的例子中是为司机师傅），我们称它为全能类或者上帝类。
 */

/**
 * 组成 抽象产品类
 * 具体产品类
 * 工厂类
 * 暴发户类
 */

// 从开闭原则来看，工厂部分好像不太理想，因为每增加一辆车，都要在工厂类中增加相应的商业逻辑和判断逻辑，这显自然是违背开闭原则的。

//抽象产品角色
public interface Car {
    void drive();
}

//具体产品角色 
class Benz implements Car {
    @Override
    public void drive() {
        System.out.println("Driving Benz ");
    }
}
//具体产品角色
class Bmw implements Car {
    @Override
    public void drive() {
        System.out.println("Driving Bmw ");
    }
}

//工厂类角色 
class SpimpleFactoryDriver {
    //工厂方法
    //注意 返回类型为抽象产品角色
    public static Car driverCar(String s) {
        //判断逻辑，返回具体的产品角色给Client
        if (s.equalsIgnoreCase("Benz")) {
            return new Benz();
        }
        if (s.equalsIgnoreCase("Bmw")) {
            return new Bmw();
        }
        return null;
    }
}

//欢迎暴发户出场......
class Magnate {
    public static void main(String[] args) {
    //告诉司机我今天坐奔驰
    Car carSimple = SpimpleFactoryDriver.driverCar("benz");
    //下命令：开车
    carSimple.drive();
    }
}